package com.open.api.wechat.app;


import com.open.api.wechat.app.request.condition.*;
import com.open.api.wechat.app.response.*;
import com.open.api.wechat.common.WeChatCommonResponse;
import com.open.api.wechat.common.response.WeChatAccessTokenResponse;
import okhttp3.Response;
import okhttp3.ResponseBody;

/**
 * @author : zhaoxuan
 * @version : 1.0
 * @date : 2021/6/25 0:08
 * @description : AppService
 */
public interface WeChatAppService {
    /**
     * @author zhaoxuan
     * @date 2021/6/25 15:08
     * @return com.open.api.wechat.common.response.WeChatAccessTokenResponse
     * @description 获取小程序全局唯一后台接口调用凭据
     **/
    WeChatAccessTokenResponse getAccessToken();

    /**
     * @author zhaoxuan
     * @date 2021/7/1 12:49
     * @param jsCode
     * @return com.open.api.wechat.app.response.WeChatCode2SessionResponse
     * @description 登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程
     **/
    WeChatCode2SessionResponse getCode2Session(String jsCode);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 13:04
     * @param accessToken, condition
     * @return com.open.api.wechat.app.response.WeChatPaidUnionIdResponse
     * @description 用户支付完成后，获取该用户的 UnionId，无需用户授权。本接口支持第三方平台代理查询。
     * 注意：调用前需要用户完成支付，且在支付后的五分钟内有效。
     **/
    WeChatPaidUnionIdResponse getPaidUnionId(WeChatPaidUnionIdCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 13:28
     * @param accessToken,condition
     * @return com.open.api.wechat.app.response.WeChatRetainResponse
     * @description 获取用户访问小程序日留存
     **/
    WeChatRetainResponse getDailyRetain(WeChatRetainCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 13:28
     * @param accessToken,condition
     * @return com.open.api.wechat.app.response.WeChatRetainResponse
     * @description 获取用户访问小程序月留存
     **/
    WeChatRetainResponse getMonthlyRetain(WeChatRetainCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 13:28
     * @param accessToken,condition
     * @return com.open.api.wechat.app.response.WeChatRetainResponse
     * @description 获取用户访问小程序周留存
     **/
    WeChatRetainResponse getWeeklyRetain(WeChatRetainCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 14:04
     * @param accessToken, condition
     * @return com.open.api.wechat.app.response.WeChatDailySummaryResponse
     * @description 获取用户访问小程序数据概况
     **/
    WeChatDailySummaryResponse getDailySummary(WeChatDailySummaryCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 14:57
     * @param accessToken, condition
     * @return com.open.api.wechat.app.response.WeChatVisitTrendResponse
     * @description 获取用户访问小程序数据日趋势
     **/
    WeChatVisitTrendResponse getDailyVisitTrend(WeChatVisitTrendCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 14:57
     * @param accessToken, condition
     * @return com.open.api.wechat.app.response.WeChatVisitTrendResponse
     * @description 获取用户访问小程序数据月趋势
     **/
    WeChatVisitTrendResponse getMonthlyVisitTrend(WeChatVisitTrendCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 14:57
     * @param accessToken, condition
     * @return com.open.api.wechat.app.response.WeChatVisitTrendResponse
     * @description 获取用户访问小程序数据周趋势
     **/
    WeChatVisitTrendResponse getWeeklyVisitTrend(WeChatVisitTrendCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 16:14
     * @param accessToken, condition
     * @return byte[]
     * @description 获取小程序二维码，适用于需要的码数量较少的业务场景。通过该接口生成的小程序码，永久有效，有数量限制，详见获取二维码
     **/
    byte[] createQRCode(WeChatCreateQRCodeCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 16:52
     * @param accessToken, condition
     * @return byte[]
     * @description 获取小程序二维码，适用于需要的码数量较少的业务场景。通过该接口生成的小程序码，永久有效，有数量限制，详见获取二维码
     **/
    byte[] getQRCode(WeChatGetQRCodeCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/1 16:52
     * @param accessToken, condition
     * @return byte[]
     * @description 获取小程序码，适用于需要的码数量极多的业务场景。通过该接口生成的小程序码，永久有效，数量暂无限制。 更多用法详见 获取二维码。
     *
     * SpringBoot下载示例,  同样的获取二维码示例如下
     * @GetMapping("/qrcode/download")
     * public void qrCodeDownLoad(HttpServletResponse response){
     *     String accessToken = weChatAppService.getAccessToken().getAccessToken();
     *     WeChatUnlimitQRCodeCondition condition = WeChatUnlimitQRCodeCondition.builder().page("").scene("/").build();
     *     byte[] bytes = weChatAppService.getUnlimitedQRCode(response1.getAccessToken(), condition);
     *     try(OutputStream out = response.getOutputStream() ){
     *         response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("aaa.jpg", "UTF-8"));
     *         response.setContentType(" application/octet-stream");
     *         out.write(Objects.requireNonNull(result.body()).bytes());
     *     } catch (IOException e) {
     *         e.printStackTrace();
     *     }
     * }
     **/
    byte[] getUnlimitedQRCode(WeChatUnlimitQRCodeCondition condition, String accessToken);

    /**
     * @author  zhaoxuan
     * @date  2021/7/2 0:26
     * @params  accessToken, condition
     * @return  com.open.api.wechat.app.response.WeChatUrlSchemeResponse
     * @description 获取小程序 scheme 码，适用于短信、邮件、外部网页、微信内等拉起小程序的业务场景。
     * 通过该接口，可以选择生成到期失效和永久有效的小程序码，目前仅针对国内非个人主体的小程序开放，详见获取 URL scheme。
     * iOS系统支持识别 URL Scheme，可在短信等应用场景中直接通过Scheme跳转小程序。
     * Android系统不支持直接识别 URL Scheme，用户无法通过 Scheme 正常打开小程序，开发者需要使用 H5 页面中转，再跳转到 Scheme 实现打开小程序，跳转代码示例如下：
     */
    WeChatUrlSchemeResponse getUrlScheme(WeChatUrlSchemeCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/2 10:59
     * @param accessToken, condition
     * @return com.open.api.wechat.app.response.WeChatUrLinkResponse
     * @description 获取小程序 URL Link，适用于短信、邮件、网页、微信内等拉起小程序的业务场景。
     * 通过该接口，可以选择生成到期失效和永久有效的小程序链接，目前仅针对国内非个人主体的小程序开放，详见获取 URL Link。
     * 只能生成已发布的小程序的 URL Link。
     * 在微信内或者安卓手机打开 URL Link 时，默认会先跳转官方 H5 中间页，如果需要定制 H5 内容，可以使用云开发静态网站
     **/
    WeChatUrLinkResponse getUrlLink(WeChatUrLinkCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/5 15:10
     * @param accessToken, condition
     * @return com.open.api.wechat.common.WeChatCommonResponse
     * @description 发送客服消息给用户。详细规则见 发送客服消息
     **/
    WeChatCommonResponse sendServiceMessage(WeChatServiceMessageCondition condition, String accessToken);

    /**
     * @author zhaoxuan
     * @date 2021/7/5 15:10
     * @param accessToken, condition
     * @return com.open.api.wechat.common.WeChatCommonResponse
     * @description 发送订阅消息
     **/
    WeChatCommonResponse sendSubscribeMessage(WeChatSubscribeMessageCondition condition, String accessToken);
}
